/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entities;

import entities.interfaces.LineaPedidoInterfaz;
import entities.interfaces.PedidoInterfaz;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author damfercer
 */
@Entity
@Table(name = "pedido", catalog = "corporate", schema = "")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Pedido.findAll", query = "SELECT p FROM Pedido p"),
    @NamedQuery(name = "Pedido.findByIdPedido", query = "SELECT p FROM Pedido p WHERE p.idPedido = :idPedido"),
    @NamedQuery(name = "Pedido.findByDescuento", query = "SELECT p FROM Pedido p WHERE p.descuento = :descuento"),
    @NamedQuery(name = "Pedido.findByFechaCreacion", query = "SELECT p FROM Pedido p WHERE p.fechaCreacion = :fechaCreacion"),
    @NamedQuery(name = "Pedido.findByFechaEntrega", query = "SELECT p FROM Pedido p WHERE p.fechaEntrega = :fechaEntrega"),
    @NamedQuery(name = "Pedido.findByFechaFinEntrega", query = "SELECT p FROM Pedido p WHERE p.fechaFinEntrega = :fechaFinEntrega"),
    @NamedQuery(name = "Pedido.findByContacto", query = "SELECT p FROM Pedido p WHERE p.contacto = :contacto"),
    @NamedQuery(name = "Pedido.findByAdelanto", query = "SELECT p FROM Pedido p WHERE p.adelanto = :adelanto"),
    @NamedQuery(name = "Pedido.findByComentarios", query = "SELECT p FROM Pedido p WHERE p.comentarios = :comentarios"),
    @NamedQuery(name = "Pedido.findByPrecioPorte", query = "SELECT p FROM Pedido p WHERE p.precioPorte = :precioPorte"),
    @NamedQuery(name = "Pedido.findByUltimaModificacion", query = "SELECT p FROM Pedido p WHERE p.ultimaModificacion = :ultimaModificacion"),
    @NamedQuery(name = "Pedido.findByEntregadoACuenta", query = "SELECT p FROM Pedido p WHERE p.entregadoACuenta = :entregadoACuenta")})
public class Pedido implements Serializable,PedidoInterfaz {
    @Column(name = "TIPO_CAMBIO")
    private BigDecimal tipoCambio;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pedido")
    private List<MultiplicadorProductoPedido> multiplicadorProductoPedidoList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pedido")
    private List<FacturaMultimarca> facturaMultimarcaList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pedido")
    private List<LineaPedido> lineaPedidoList;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID_PEDIDO")
    private Integer idPedido;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "DESCUENTO")
    private BigDecimal descuento;
    @Basic(optional = false)
    @NotNull
    @Column(name = "FECHA_CREACION")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaCreacion;
    @Column(name = "FECHA_ENTREGA")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaEntrega;
    @Column(name = "FECHA_FIN_ENTREGA")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaFinEntrega;
    @Size(max = 30)
    @Column(name = "CONTACTO")
    private String contacto;
    @Column(name = "ADELANTO")
    private Integer adelanto;
    @Size(max = 250)
    @Column(name = "COMENTARIOS")
    private String comentarios;
    @Column(name = "PRECIO_PORTE")
    private BigDecimal precioPorte;
    @Basic(optional = false)
    @NotNull
    @Column(name = "ULTIMA_MODIFICACION")
    @Temporal(TemporalType.TIMESTAMP)
    private Date ultimaModificacion;
    @Column(name = "ENTREGADO_A_CUENTA")
    private BigDecimal entregadoACuenta;
    @JoinColumn(name = "USUARIO_CREADOR", referencedColumnName = "ID_USUARIO")
    @ManyToOne(optional = false)
    private Usuario usuarioCreador;
    @JoinColumn(name = "TIENDA", referencedColumnName = "ID_TIENDA")
    @ManyToOne
    private Tienda tienda;
    @JoinColumn(name = "RESTO", referencedColumnName = "ID_RESTO")
    @ManyToOne
    private Resto resto;
    @JoinColumn(name = "FORMA_PAGO", referencedColumnName = "ID_FORMA_PAGO")
    @ManyToOne
    private FormaPago formaPago;
    @JoinColumn(name = "ESTADO", referencedColumnName = "ID_ESTADO_PEDIDO")
    @ManyToOne(optional = false)
    private EstadoPedido estado;
    @JoinColumn(name = "CLIENTE", referencedColumnName = "ID_CLIENTE")
    @ManyToOne(optional = false)
    private Cliente cliente;


    public Pedido() {
    }

    public Pedido(Integer idPedido) {
        this.idPedido = idPedido;
    }

    public Pedido(Integer idPedido, Date fechaCreacion, Date ultimaModificacion) {
        this.idPedido = idPedido;
        this.fechaCreacion = fechaCreacion;
        this.ultimaModificacion = ultimaModificacion;
    }

    public Integer getIdPedido() {
        return idPedido;
    }

    public void setIdPedido(Integer idPedido) {
        this.idPedido = idPedido;
    }

    public BigDecimal getDescuento() {
        return descuento;
    }

    public void setDescuento(BigDecimal descuento) {
        this.descuento = descuento;
    }

    public Date getFechaCreacion() {
        return fechaCreacion;
    }

    public void setFechaCreacion(Date fechaCreacion) {
        this.fechaCreacion = fechaCreacion;
    }

    public Date getFechaEntrega() {
        return fechaEntrega;
    }

    public void setFechaEntrega(Date fechaEntrega) {
        this.fechaEntrega = fechaEntrega;
    }

    public Date getFechaFinEntrega() {
        return fechaFinEntrega;
    }

    public void setFechaFinEntrega(Date fechaFinEntrega) {
        this.fechaFinEntrega = fechaFinEntrega;
    }

    public String getContacto() {
        return contacto;
    }

    public void setContacto(String contacto) {
        this.contacto = contacto;
    }

    public Integer getAdelanto() {
        return adelanto;
    }

    public void setAdelanto(Integer adelanto) {
        this.adelanto = adelanto;
    }

    public String getComentarios() {
        return comentarios;
    }

    public void setComentarios(String comentarios) {
        this.comentarios = comentarios;
    }

    public BigDecimal getPrecioPorte() {
        return precioPorte;
    }

    public void setPrecioPorte(BigDecimal precioPorte) {
        this.precioPorte = precioPorte;
    }

    public Date getUltimaModificacion() {
        return ultimaModificacion;
    }

    public void setUltimaModificacion(Date ultimaModificacion) {
        this.ultimaModificacion = ultimaModificacion;
    }

    public BigDecimal getEntregadoACuenta() {
        return entregadoACuenta;
    }

    public void setEntregadoACuenta(BigDecimal entregadoACuenta) {
        this.entregadoACuenta = entregadoACuenta;
    }

    public Usuario getUsuarioCreador() {
        return usuarioCreador;
    }

    public void setUsuarioCreador(Usuario usuarioCreador) {
        this.usuarioCreador = usuarioCreador;
    }

    public Tienda getTienda() {
        return tienda;
    }

    public void setTienda(Tienda tienda) {
        this.tienda = tienda;
    }

    public Resto getResto() {
        return resto;
    }

    public void setResto(Resto resto) {
        this.resto = resto;
    }

    public FormaPago getFormaPago() {
        return formaPago;
    }

    public void setFormaPago(FormaPago formaPago) {
        this.formaPago = formaPago;
    }

    public EstadoPedido getEstado() {
        return estado;
    }

    public void setEstado(EstadoPedido estado) {
        this.estado = estado;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idPedido != null ? idPedido.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Pedido)) {
            return false;
        }
        Pedido other = (Pedido) object;
        if ((this.idPedido == null && other.idPedido != null) || (this.idPedido != null && !this.idPedido.equals(other.idPedido))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.Pedido[ idPedido=" + idPedido + " ]";
    }

    @XmlTransient
    public List<LineaPedido> getLineaPedidoList() {
        return lineaPedidoList;
    }

    public void setLineaPedidoList(List<LineaPedido> lineaPedidoList) {
        this.lineaPedidoList = lineaPedidoList;
    }
        
    
    public Integer getUnidades(){
        Integer unidades=0;
        for (LineaPedido lineaPedido : lineaPedidoList) {
            unidades+=lineaPedido.getCantidad();
        }
        return unidades;
    }
    
    public Integer getUnidadesServidas(){
        Integer cantidad=0;
        if(this.getFacturaMultimarcaList()!=null){
            for(FacturaMultimarca factura: this.getFacturaMultimarcaList()){
                if(factura.getLineaFacturaMultimarcaList()!=null){
                    for(LineaFacturaMultimarca lineaFacturaMultimarca: factura.getLineaFacturaMultimarcaList()){
                        cantidad+=lineaFacturaMultimarca.getCantidad();
                    }
                }
            } 
        }
        return cantidad;
    }

    @Override
    public Integer getId() {
        return this.idPedido;
    }

    @Override
    public List<LineaPedidoInterfaz> getLineas() {
        List<LineaPedidoInterfaz> lineas=new ArrayList<LineaPedidoInterfaz>();
        lineas.addAll(this.lineaPedidoList);
        return lineas;
    }

    @XmlTransient
    public List<FacturaMultimarca> getFacturaMultimarcaList() {
        return facturaMultimarcaList;
    }

    public void setFacturaMultimarcaList(List<FacturaMultimarca> facturaMultimarcaList) {
        this.facturaMultimarcaList = facturaMultimarcaList;
    }

    public BigDecimal getTipoCambio() {
        return tipoCambio;
    }

    public void setTipoCambio(BigDecimal tipoCambio) {
        this.tipoCambio = tipoCambio;
    }

    @XmlTransient
    public List<MultiplicadorProductoPedido> getMultiplicadorProductoPedidoList() {
        return multiplicadorProductoPedidoList;
    }

    public void setMultiplicadorProductoPedidoList(List<MultiplicadorProductoPedido> multiplicadorProductoPedidoList) {
        this.multiplicadorProductoPedidoList = multiplicadorProductoPedidoList;
    }
    
}
